#ifndef ARCHIVODOCTERM_H_
#define ARCHIVODOCTERM_H_

#include "indexes/ArbolBMas.h"
#include "indexes/Registro.h"
#include <string>
#include <vector>

#ifndef ID_TERMINO
#define ID_TERMINO "idTermino"
#endif

#ifndef ID_DOCUMENTO
#define ID_DOCUMENTO "idDocumento"
#endif

/*
 * Clase que define la clave del indice
 */
class ClaveDocTerm : public Registro
{
public:
	ClaveDocTerm(const long idDoc=0,const long idTerm=0)
	{
		(*this)[ID_DOCUMENTO] = idDoc;
		(*this)[ID_TERMINO] = idTerm;
	}
	long getIdDocumento(){return *((long*) ((*this)[ID_DOCUMENTO].getValor()));}
	long getIdTermino(){return *((long*) ((*this)[ID_TERMINO].getValor()));}
};

#ifndef FREC
#define FREC "frec"
/*
 * Clase que define el dato
 */
class DatoFrec : public Registro
{
	
public:
	
	DatoFrec(const long num=1)
	{
		(*this)[FREC] = (long) num;
	}
	long getFrecuencia(){return *((long*) ((*this)[FREC].getValor()));}
	void setFrecuencia(long f){(*this)[FREC]=f;}
};
#endif

struct IdTerm_Frec {
	long IdTermino;
	long Frecuencia;
};



class archivoDocTerm
{
private:
	ArbolBMas<ClaveDocTerm,DatoFrec> indice;
public:
	archivoDocTerm(string ruta);
	~archivoDocTerm();
	/*
	 * Agrega la relacion IdTermino IdDocumento con frecuencia frec, 
	 * si la relacion existe incrementa la frecuencia en frec
	 */
	int agregarRelacion(long idDoc, long idTerm, long frec=1);
	/*
	 * Devuelve un vector con todas los ids y frecuencia de las terminos en el documento
	 * con idDoc
	 */
	vector<IdTerm_Frec> obtenerIdTermFrec(long idDocumento);
    /*
	 * Devuelve la frecuencia del termino idTerm en el documento idDoc
	 */
	long obtenerFrecuencia(long idDoc, long idTerm);
	/*
	 * Eliminar la relacion idDoc con IdTermino
	 */
	int eliminarRelacion(long idDoc, long idTerm);
	/*
	 * Elimina todas las relaciones del idDoc
	 * devuelve un vector con todas los idTerminos
	 */
	vector<long> eliminarRelaciones(long idDoc);
	
};

#endif /*ARCHIVODOCTERM_H_*/
